<?php 
class ListController extends Controller{
	public function index(){
	    $id=$_GET['id'];
		
//		通过id获得所有商品表的id
		$this->assign("topCate",M('category')->where("pid=0")->all());
//		通过id获得所有商品id
		$gids=$this->_cidGetGid($id);
		
//		通过gid获得所有属性
	if($gids){
		
		$attrData=$this->_getAttr($gids);
	
		
		$this->assign("attrData",$attrData);
		
		$param=isset($_GET['param'])?explode('_',$_GET['param']):array_fill(0,count($attrData),0);
//		$param里的参数其实是商品属性表中的id之一
		
		$this->assign('param',$param);
//		通过$params获得gid集合再将这个集合和gids取交集
		$finalGids=$this->_filterGid($param,$gids);
//		通过gid获得商品信息
        $goodsData=M()->join("__goods__ g JOIN __details__ d ON g.gid=d.goods_gid")->where('gid in ('.implode(',',$finalGids).')')->all();
		
//		p($goodsData);
		$this->assign('goodsData',$goodsData);

		
	
		
		
	}else{
		$finalGids=$gids;
		
	}
	$this->assign('finalGids',$finalGids);
//	处理配件
 
        $peijianCids=$this->_getSonCids(5,M("category")->all());
		$peijianData=M("goods")->where('category_id in ('.implode(',',$peijianCids).')')->all();
//		p($peijianData);
		$this->assign('peijianData',$peijianData);
//处理分组数据
        $peijiangroup=M("goods")->where('category_id in ('.implode(',',$peijianCids).')')->group('category_id')->all();
		$this->assign('peijiangroup',$peijiangroup);
//		p($peijiangroup);
	
        
		$this->display();
	}
	private function _cidGetGid($id){
//		获得所有分类子集
        $cateData=M("category")->all();
//		通过id获得所有子集
        $sonCids=$this->_getSonCids($id,$cateData);
//		通过cid集合获得所有gid组合
        
		
        $gids=M("goods")->where('category_id in('.implode(',',$sonCids).')')->getField('gid',true);
		return $gids;
        
		
	}
	private function _getAttr($gids){
//	    通过gids获得所有attr属性，
//      分组是会丢失数据，但通过自关联可以将数据找回
		$attrData=M("goodsattr")->where('goods_gid in('.implode(',',$gids).')')->group('gavalue')->all();
//		把相同类型的属性归结在一起
        $attrFirst=array();
        foreach($attrData as $v){
        	$attrFirst[$v['typeproperty_id']][]=$v;
	
        }
		$attrsecond=array();
		foreach($attrFirst as $typeproperty_id =>$value){
			$attrsecond[]=array(
			'name'=>M('typeproperty')->where('id='.$typeproperty_id)->getField('propertyname'),
			'value'=>$value
			);
			
		}
	
		return $attrsecond;
     
		
	}
	private function _getSonCids($id,$cateData){
		$temp=array();
		
	//	首先把自己加上，再看有没有子集，如果有子集
		foreach($cateData as $k=>$v){
			if($v['pid']==$id){
				$temp[]=$v['id'];
	//			有可能子集也有子集，要把它的子集也添加进来
	            $temp= array_merge($temp,$this->_getSonCids($v['id'],$cateData));
			}
			
		}
		return $temp;
				
	}
//	过滤gid的方法
    private function _filterGid($param,$gids){
//  	首先通过$param获得gid组合，$param里的值其实是商品属性id,通过商品属性id可以获得商品id
        $temp=array();
        foreach($param as $id){
//      	如果有选择，则将$temp加一个gid集合
        	if($id){
        		$temp[]=M()->join("__goodsattr__ ga1 JOIN __goodsattr__ ga2 ON ga1.gavalue=ga2.gavalue")
        		->where("ga1.id=".$id)->getField('ga2.goods_gid',true);
        	}
        }
//		如果是全部不限则取得当前分类下的全部商品id;
        if($temp){
//      	如果点了一些属性
//        将temp中的元素依次去取交集
//        第一步，将第一个元素和自己取交集
//        第二步，将$temp数组中的第一个元素和第二个元素取交集
//        第三部,将取好交集的元素和第三个元素去取交集
          $finalGids=$temp[0];
		  foreach($temp as $v){
		  	$finalGids=array_intersect($finalGids,$v);
		  }
		  $finalGids=array_intersect($finalGids,$gids);
		  return $finalGids;
                          
          


        }else{
        	return $gids;
        	
        	
        }
	
        
        
        

        
    	
    }
	
}
	?>